//Julian Robichaux //http://www.nsftools.com/tips/ZipLookupTest.htm var queryField; var lookupURL; var divName; var ifName; var lastVal = ""; var val = "" var xmlHttp; var cache = new Object(); var searching = false; var globalDiv; var divFormatted = false; var DIV_BG_COLOR = "#ffffff"; var DIV_HIGHLIGHT_COLOR = "#CCCCCC"; var FONT_COLOR = "#000000"; var FONT_HOVER_COLOR = "#345343"; var bInitialPageLoad = true; var bInitQueryCodeComplete = false; function InitQueryCode (queryFieldName, lookupURLPrefix, hiddenDivName) { if (bInitQueryCodeComplete == true) { return; } bInitQueryCodeComplete = true queryField = document.getElementsByName(queryFieldName).item(0); queryField.onblur = hideDiv; queryField.onkeydown = keypressHandler; queryField.autocomplete = "off"; lookupURL = lookupURLPrefix; if (hiddenDivName) { divName = hiddenDivName; } else { divName = "querydiv"; } ifName = "queryiframe"; addToCache("", new Array(), new Array()); setTimeout("mainLoop()", 100); } function addToCache (queryString, resultArray1, resultArray2) { if (queryString.length > 0) { if(resultArray1.length == 0) return; } cache[queryString] = new Array(resultArray1, resultArray2); } mainLoop = function() { /*if (bInitialPageLoad == true) { setTimeout("mainLoop()", 100); return true; }*/ val = escape(queryField.value); if(lastVal != val && searching == false) { var cacheResult = cache[val]; if (cacheResult) { showQueryDiv(val, cacheResult[0], cacheResult[1]); } else { doRemoteQuery(val); } lastVal = val; } setTimeout("mainLoop()", 100); return true; } ; function getDiv (divID) { if (!globalDiv) { if (!document.getElementById(divID)) { var newNode = document.createElement("div"); newNode.setAttribute("id", divID); document.body.appendChild(newNode); } globalDiv = document.getElementById(divID); var x = queryField.offsetLeft; var y = queryField.offsetTop + queryField.offsetHeight; var parent = queryField; while (parent.offsetParent) { parent = parent.offsetParent; x += parent.offsetLeft; y += parent.offsetTop; } if (!divFormatted) { globalDiv.style.backgroundColor = DIV_BG_COLOR; globalDiv.style.fontFamily = "Arial, Helvetica, sans-serif"; globalDiv.style.border = "1px solid #666666"; globalDiv.style.fontSize = "13px"; globalDiv.style.width = queryField.style.width; globalDiv.style.position = "absolute"; globalDiv.style.left = x + "px"; globalDiv.style.top = y + "px"; globalDiv.style.visibility = "hidden"; globalDiv.style.zIndex = 10000; divFormatted = true; } } return globalDiv; } function showQueryDiv (queryString, resultArray1, resultArray2) { var div = getDiv(divName); while (div.childNodes.length > 0) { div.removeChild(div.childNodes[0]); } for (var i = 0; i < resultArray1.length; i++) { // each result will be contained within its own div var result = document.createElement("div"); result.style.cursor = "pointer"; result.style.padding = "0px 3px 0px 3px"; _unhighlightResult(result); result.onmousedown = selectResult; result.onmouseover = highlightResult; result.onmouseout = unhighlightResult; var result1 = document.createElement("span"); result1.className = "result1"; result1.style.textAlign = "left"; result1.style.fontWeight = "normal"; result1.innerHTML = resultArray1[i]; var result2 = document.createElement("span"); result2.className = "result2"; result2.style.textAlign = "right"; result2.style.paddingLeft = "20px"; result2.innerHTML = resultArray2[i]; result.appendChild(result1); //result.appendChild(result2); div.appendChild(result); } var isCached; if(cache[queryString]) isCached = true; else isCached = false; if (!isCached) { addToCache(queryString, resultArray1, resultArray2); } showDiv(resultArray1.length > 0); } function selectResult() { _selectResult(this); } function _selectResult(item) { var spans = item.getElementsByTagName("span"); if (spans) { for (var i = 0; i < spans.length; i++) { if (spans[i].className == "result1") { queryField.value = unescapeHTML(spans[i].innerHTML); lastVal = val = queryField.value; searching = false; mainLoop(); queryField.focus(); showDiv(false); //document.forms[0].submit(); return; } } } } function highlightResult() { _highlightResult(this); } function _highlightResult(item) { item.style.backgroundColor = DIV_HIGHLIGHT_COLOR; item.style.color= FONT_HOVER_COLOR } function unhighlightResult() { _unhighlightResult(this); } function _unhighlightResult(item) { item.style.backgroundColor = DIV_BG_COLOR; item.style.color= FONT_COLOR } function showDiv (show) { var div = getDiv(divName); if (show) { div.style.visibility = "visible"; } else { div.style.visibility = "hidden"; } adjustiFrame(); } function hideDiv () { showDiv(false); } function adjustiFrame() { if (!document.getElementById(ifName)) { var newNode = document.createElement("iFrame"); newNode.setAttribute("id", ifName); newNode.setAttribute("src", "javascript:false;"); newNode.setAttribute("scrolling", "no"); newNode.setAttribute("frameborder", "0"); document.body.appendChild(newNode); } iFrameDiv = document.getElementById(ifName); var div = getDiv(divName); try { iFrameDiv.style.position = "absolute"; iFrameDiv.style.width = div.offsetWidth; iFrameDiv.style.height = div.offsetHeight; iFrameDiv.style.top = div.style.top; iFrameDiv.style.left = div.style.left; iFrameDiv.style.zIndex = div.style.zIndex - 1; iFrameDiv.style.visibility = div.style.visibility; } catch(e) { } } function getXMLHTTP(handler) { var objXmlHttp = null; if (navigator.userAgent.indexOf("Opera")>=0) { return null; } if (navigator.userAgent.indexOf("MSIE")>=0) { var strName="Msxml2.XMLHTTP"; if (navigator.appVersion.indexOf("MSIE 5.5")>=0) { strName="Microsoft.XMLHTTP"; } try { objXmlHttp = new ActiveXObject(strName); objXmlHttp.onreadystatechange = handler; return objXmlHttp; } catch(e) { return null; } } if (navigator.userAgent.indexOf("Mozilla")>=0) { objXmlHttp = new XMLHttpRequest(); objXmlHttp.onload = handler; objXmlHttp.onerror = handler; return objXmlHttp; } return null; } function xmlDataEvent() { if ( (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") && (searching)) { var resultArr = xmlHttp.responseText.split("|"); var q = resultArr[0]; resultArr.shift(); showQueryDiv(q, resultArr, new Array()); searching = false; } else { } } function doRemoteQuery (queryString) { searching = true; if(xmlHttp && xmlHttp.readyState != 0) { xmlHttp.abort(); } xmlHttp = getXMLHTTP(xmlDataEvent); if(xmlHttp) { try { xmlHttp.open("GET", lookupURL + queryString, true); } catch(e) { } xmlHttp.send(null); } } function keypressHandler (evt) { bInitialPageLoad = false; // don't do anything if the div is hidden var div = getDiv(divName); if (div.style.visibility == "hidden") { return true; } // make sure we have a valid event variable if(!evt && window.event) { evt = window.event; } var key = evt.keyCode; // if this key isn't one of the ones we care about, just return var KEYUP = 38; var KEYDOWN = 40; var KEYENTER = 13; var KEYTAB = 9; if ((key != KEYUP) && (key != KEYDOWN) && (key != KEYENTER) && (key != KEYTAB)) { return true; } // get the span that's currently selected, and perform an appropriate action var selNum = getSelectedSpanNum(div); var selSpan = setSelectedSpan(div, selNum); if ((key == KEYENTER) || (key == KEYTAB)) { if (selSpan) { _selectResult(selSpan); } evt.cancelBubble=false; return true; } else { switch(key) { case KEYUP: selSpan = setSelectedSpan(div, selNum - 1); break; case KEYDOWN: selSpan = setSelectedSpan(div, selNum + 1); break; } if (selSpan) { _highlightResult(selSpan); } } showDiv(true); return true; } function getSelectedSpanNum (div) { var count = -1; var spans = div.getElementsByTagName("div"); if (spans) { for (var i = 0; i < spans.length; i++) { count++; if (spans[i].style.backgroundColor != div.style.backgroundColor) { return count; } } } return -1; } function setSelectedSpan (div, spanNum) { var count = -1; var thisSpan; var spans = div.getElementsByTagName("div"); if (spans) { for (var i = 0; i < spans.length; i++) { if (++count == spanNum) { _highlightResult(spans[i]); thisSpan = spans[i]; } else { _unhighlightResult(spans[i]); } } } return thisSpan; } function escapeHTML(text) { var div = document.createElement('div'); var text = document.createTextNode(this); div.appendChild(text); return div.innerHTML; } function unescapeHTML(text) { var div = document.createElement('div'); div.innerHTML = stripTags(text); return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; } function stripTags (text) { return text.replace(/<\/?[^>]+>/gi, ''); }